package com.wfm.leetcode.editor.cn;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 第一种方法：
 * 控制重复是在找选择空间的时候判断的
 *    1      1(这个时候会判断used[i-1]==false 则跳过)      2
 *   1 2
 *  2   1
 * 第二种方法：
 * 控制重复直接在添加解的时候用set
 */
public class PFour7全排列II{
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    //存放结果
    List<List<Integer>> result = new ArrayList<>();
    //暂存结果
    List<Integer> path = new ArrayList<>();

    public List<List<Integer>> permuteUnique(int[] nums) {
        boolean[] used = new boolean[nums.length];
        Arrays.sort(nums);
        backTrack(nums, used);
        return result;
    }

    private void backTrack(int[] nums, boolean[] used) {
        if (path.size() == nums.length) {
            result.add(new ArrayList<>(path));
            return;
        }
        for (int i = 0; i < nums.length; i++) {
            // used[i - 1] == true，说明同⼀树⽀nums[i - 1]使⽤过
            // used[i - 1] == false，说明同⼀树层nums[i - 1]使⽤过
            // 如果同⼀树层nums[i - 1]使⽤过则直接跳过
            if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
                continue;
            }
            //如果同⼀树⽀nums[i]没使⽤过开始处理
            if (used[i] == false) {
                used[i] = true;//标记同⼀树⽀nums[i]使⽤过，防止同一树枝重复使用
                path.add(nums[i]);
                backTrack(nums, used);
                path.remove(path.size() - 1);//回溯，说明同⼀树层nums[i]使⽤过，防止下一树层重复
                used[i] = false;//回溯
            }
        }
    }

//    Set<List<Integer>> res = new HashSet<>();
//    List<Integer> path =new ArrayList<>();
//    boolean[] visited;
//    public List<List<Integer>> permuteUnique(int[] nums) {
//        visited = new boolean[nums.length];
//        for (int i = 0; i < nums.length; i++) {
//            dfs(nums,i);
//        }
//        return new ArrayList<>(res);
//    }
//    void dfs(int[] nums,int i){
//        path.add(nums[i]);
//        visited[i]=true;
//        if(path.size()==nums.length){
//            res.add(new ArrayList<>(path));
//        }
//        for (int j = 0; j < nums.length; j++) {
//            if(!visited[j]){
//                dfs(nums,j);
//            }
//        }
//        path.remove(path.size()-1);
//        visited[i]=false;
//    }

}
//leetcode submit region end(Prohibit modification and deletion)

    public static void main(String[] args) { 
        Solution solution = new PFour7全排列II().new Solution();
        int[] nums = {1, 1, 2};
        solution.permuteUnique(nums);
        System.out.println(solution.result);
    }
}